# 当我们拿到一个对象的引用时，如何知道这个对象是什么类型、有哪些方法呢？
# 使用type()
# 首先，我们来判断对象类型，使用type()函数：
# 基本类型都可以用type()判断：
print(type(123))
print(type('123'))
print(type(None))
print(type([1, 2, 3]))
print(type({'name': 'liangkun', 'class': '32班'}))

# 如果一个变量指向函数或者类，也可以用type()判断：
print(type(abs))


class Figure(object):
    def __init__(self) -> None:
        super().__init__()


a = Figure()
print(type(a))
# 但是type()函数返回的是什么类型呢？它返回对应的Class类型。如果我们要在if语句中判断，就需要比较两个变量的type类型是否相同：
print(type(123) == type(456))
print(type(123) == int)
print(type('abc') == type('123'))
print(type('abc') == str)
print(type('abc') == type(123))

# 判断基本数据类型可以直接写int，str等，但如果要判断一个对象是否是函数怎么办？可以使用types模块中定义的常量：
print('**************************判断一个对象是否是函数*************************************')
import types


def fn():
    pass


# FunctionType:对于一些我们自己定义函数，或者是在别的模块中导入的函数
# BuiltinFunctionType:对于一些像"abs", "max", "min" 的函数，他们对应的常量都是BuiltinFunctionTyp
# LambdaType:字面上看就知道这是个关于匿名函数的常量名
print(type(fn) == types.FunctionType)
print(type(abs) == types.BuiltinFunctionType)
print(type(lambda x: x) == types.LambdaType)

# 使用isinstance() [參考继承和多态03]
# 对于class的继承关系来说，使用type()就很不方便。我们要判断class的类型，可以使用isinstance()函数。
